package com.briup.day14;

import com.google.gson.Gson;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.*;

public class IOTest3 {
    public static void main(String[] args) {
       /*
        json：能够通过一个标准化的字符串格式，表示一个对象
            {}：表示一个对象，在{}内部通过key:value表示key和value的映射，
            左边的key表示对象的属性名，右边value是属性值
        */
        String s = """
                {
                    name:"李四",
                    gender:"女"
                }
                """;
        // 如何将一个json字符串解析成一个Java类对象
        // 使用Google的Gson解析
        Gson gson = new Gson();
        Student student = gson.fromJson(s, Student.class);
        System.out.println(student);
    }

    // 从文件中读取对象数据，必须保证本程序能够加载到该对象所对应的字节码文件
    private static void load() {
         /* 期望获取到student.dat文件中存储的对象
         IO流中输出流和输出流基本上都有对应配套的，
         所以通常情况下使用哪种输出流写出的数据，就应该使用其对应的输入流读取；
         如对象输出流写出的数据，只能使用对象输入流进行读取
         */
        try (ObjectInputStream ois = new ObjectInputStream(
                new FileInputStream("student.dat"))) {
            // 在ObjectInputStream中存在一个方法，叫做readObject()，
            // 能够读取你通过OOS写出去的对象
            // 每次只能读取一个对象；本质上来说，从文件中读取对象数据，
            // 就是将文件中存储的对象数据重新序列化为一个指定类的新的对象
            Object o = ois.readObject();
            System.out.println(o);
        } catch (IOException e) {
            System.err.println("出现IO异常:" + e.getMessage());
        } catch (ClassNotFoundException e) {
            System.out.println("该类找不到:" + e.getMessage());
        }
    }

    // 将对象数据从程序中写出到文件中
    private static void store() {
         /*
        IO流能够实现数据的持久化操作
         目前只能将字符串数据实现持久化，
         如果想实现某一个对象的持久化应该如何解决
         */
        // 要将一个Student对象实现持久化存储
        Student student = new Student("张三", "男");
        // 此时就可以使用对象输出流进行传输，注意对象输出流也是一个包装流
        try (FileOutputStream fos =
                     new FileOutputStream("student.dat");
             ObjectOutputStream oos = new ObjectOutputStream(fos)) {
            // 在ObjectOutputStream类中存在一个方法writeObject()，
            // 能够将你传入的对象，写出到你指定的目的地中，如文件，网络传输通道
            oos.writeObject(student);
            oos.flush();
        } catch (IOException e) {
            System.err.println("出现IO异常:" + e.getMessage());
        }
    }

    // 如果将要某一个类的对象通过对象输出流写出到文件中，那么该类必须实现Serializable接口
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    static class Student implements Serializable {
        String name;
        String gender;
    }

    private static void test() {
        /*
        BufferedXXX：叫做缓冲流，能够在读取数据时将数据先缓冲到一个数组中，
        从而提升IO读写的效率；是一个包装流，只能辅助基本的如文件流使用
        在缓冲流中，字符输入缓冲流内存在一个方法readLine()，
        能够保证一次只读取一行数据
        */
        try (BufferedReader br = new BufferedReader(
                new FileReader("resource/c.txt"))) {
            // 使用readLine方法，每次读取一整行的数据，
            // 如果读取到文件末尾，即无数据可读，则返回null
            String s = br.readLine();
            System.out.println(s);
            // 读取全部未读取的数据
            while ((s = br.readLine()) != null) {
                System.out.println(s);
            }
        } catch (IOException e) {
            System.err.println("出现IO异常:" + e.getMessage());
        }
    }
}
